﻿using System;
using System.Data;
using System.Data.Common;
using System.Data.Objects;
using System.Data.SqlClient;
using System.Linq;
using Microsoft.Practices.EnterpriseLibrary.Data;
using VO;
using System.Collections.Generic;

namespace DAL
{
    public class CampanhaDAL
    {

        #region Insert
        public int Insert(Campanha obj)
        {
            int idCampanha = 0;
            using (var contexto = new CallcenterEntities())
            {
                var objC = new tbCCCampanha();
                objC = PopulaObjeto(obj, objC);
                contexto.AddTotbCCCampanha(objC);
                contexto.SaveChanges();
                idCampanha = objC.idCampanha;


                obj.idCampanha = idCampanha;

                CopiaRegras(obj);
            }
            return idCampanha;
        }
        #endregion

        #region Update
        public void Update(Campanha obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha
                                where campanhaAux.idCampanha == obj.idCampanha
                                select campanhaAux).First();
                PopulaObjeto(obj, campanha);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region UpdateStatus
        public void UpdateStatus(Campanha obj)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha
                                where campanhaAux.idCampanha == obj.idCampanha
                                select campanhaAux).First();
                campanha.fgAtivo = obj.fgAtivo;
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Delete
        public void Delete(int idCampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                var campanha = (from campanhaAux in contexto.tbCCCampanha
                                where campanhaAux.idCampanha == idCampanha
                                select campanhaAux).First();
                contexto.DeleteObject(campanha);
                contexto.SaveChanges();
            }
        }
        #endregion

        #region Select
        public IList<Campanha> Select(Campanha objcampanha)
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha> campanha;

                var campanha = (from campanhaAux in contexto.tbCCCampanha
                                join tipocampanha in contexto.tbCCTipoCampanha on campanhaAux.idTipoCampanha equals tipocampanha.idTipoCampanha
                                join convenioAux in contexto.tbCCConvenio on campanhaAux.Convenio equals convenioAux.idEmpresa into sr
                                from convenioAux in sr.DefaultIfEmpty()
                                where (campanhaAux.idCampanha == objcampanha.idCampanha || objcampanha.idCampanha == 0) &&
                                    (objcampanha.idConvenio == 0 || convenioAux.idEmpresa == objcampanha.idConvenio) &&
                                    (objcampanha.idTipoCampanha == 0 || campanhaAux.idTipoCampanha == objcampanha.idTipoCampanha)
                                select new
                                {
                                    campanhaAux.idCampanha,
                                    campanhaAux.nomeCampanha,
                                    campanhaAux.descricao,
                                    campanhaAux.alias,
                                    idEmpresa = campanhaAux.Convenio,
                                    convenioAux.Convenio,
                                    campanhaAux.dtFinalizacao,
                                    campanhaAux.dtCadastro,
                                    campanhaAux.fgAtivo,
                                    tipocampanha.TipoCampanha,
                                    tipocampanha.idTipoCampanha
                                });

                //Carrega lista
                var list = new List<Campanha>();
                foreach (var obj in campanha)
                {
                    var newObj = new Campanha();
                    newObj.idCampanha = obj.idCampanha;
                    newObj.nomeCampanha = obj.nomeCampanha;
                    newObj.descricao = obj.descricao;
                    newObj.alias = obj.alias;
                    newObj.idEmpresa = obj.idEmpresa;
                    newObj.Convenio = obj.Convenio;
                    newObj.dtFinalizacao = obj.dtFinalizacao;
                    newObj.dtCadastro = obj.dtCadastro;
                    newObj.fgAtivo = obj.fgAtivo;
                    newObj.TipoCampanha = obj.TipoCampanha;
                    newObj.idTipoCampanha = obj.idTipoCampanha;
                    list.Add(newObj);
                }

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return list;
            }
        }
        #endregion

        #region PopulaObjeto
        protected static tbCCCampanha PopulaObjeto(Campanha obj, tbCCCampanha tabela)
        {
            tabela.nomeCampanha = obj.nomeCampanha;
            tabela.descricao = obj.descricao;
            tabela.alias = obj.alias;
            tabela.Convenio = obj.idEmpresa;
            tabela.dtCadastro = obj.dtCadastro;
            tabela.dtFinalizacao = obj.dtFinalizacao;
            tabela.fgAtivo = true;
            tabela.idCampanha = obj.idCampanha;
            tabela.idTipoCampanha = obj.idTipoCampanha;
            return tabela;
        }

        //protected static IList<Campanha> PopulaObjeto(IQueryable<tbCCCampanha> reader)
        //{
        //    IList<Campanha> list = new List<Campanha>();
        //    foreach (var obj in reader)
        //    {
        //        var newObj = new Campanha();
        //        newObj.idCampanha = obj.idCampanha;
        //        newObj.nomeCampanha = obj.nomeCampanha;
        //        newObj.descricao = obj.descricao;
        //        newObj.alias = obj.alias;
        //        newObj.Convenio = obj.Convenio;
        //        newObj.dtCadastro = obj.dtCadastro;
        //        newObj.dtFinalizacao = obj.dtFinalizacao;
        //        newObj.fgAtivo = obj.fgAtivo;
        //        list.Add(newObj);
        //    }
        //    return list;
        //}
        #endregion

        #region CopiaRegrasAtendentesClientes
        private Database db;
        protected void CopiaRegras(Campanha obj)
        {
            var contexto = new CallcenterEntities().fnReplicaRegraCampanha(obj.idCampanhaCopia,obj.idCampanha,obj.fgCopiaRegra,obj.fgCopiaAtendentes,obj.fgCopiaClientes);
            
        }

        public IList<Campanha> SelectTipoCampanha()
        {
            using (var contexto = new CallcenterEntities())
            {
                //IQueryable<tbCCCampanha> campanha;

                var campanha = (from campanhaAux in contexto.tbCCTipoCampanha
                                select new
                                {
                                   campanhaAux.idTipoCampanha,campanhaAux.TipoCampanha
                                });

                //Carrega lista
                var list = new List<Campanha>();
                foreach (var obj in campanha)
                {
                    var newObj = new Campanha();
                    newObj.TipoCampanha = obj.TipoCampanha;
                    newObj.idTipoCampanha = obj.idTipoCampanha;
                    list.Add(newObj);
                }

                //Carrega lista
                //var list = PopulaObjeto(campanha);

                return list;
            }
        }



        #endregion

    }
}